package scala

import org.apache.spark.mllib.recommendation.{ALS, Rating}
import org.apache.spark.{SparkConf, SparkContext}

/**
  * 项目名称:spark-learn<br>
  * 包名:scala<br>
  * 用于:spark-learn<br>
  * 创建时间:2019年03月16日<br>
  * 更新时间:2019年03月16日<br>
  *
  * @author :lds（创建人）<br>
  * @version :v1.0（版本号）<br>
  * @since jdk1.8
  */
object CollaborativeFilter {

//  def train(ratings:RDD[Rating],rank:Int,iterations:Int,lambda:Double,blocks:Int,seed:Long):MatrixFactorizationModel= {
//    //numBlocks:并行计算的block数（-1为自动配置）
//    //rank:模型中隐藏因子数
//    //iterations:算法迭代次数
//    //lambda:ALS中的正则化参数
//    //implicitPref:使用显示反馈ALS变量或隐式反馈
//    //alpha:ALS隐式反馈变化率用于控制每次拟合修正的幅度
//    new ALS(blocks, blocks, rank, iterations, lambda, false, 1.0, seed).run(ratings)
//  }

  def main(args: Array[String]): Unit = {

    val conf = new SparkConf()
    conf.setMaster("local").setAppName("CollaborativeFilter")
    val sc = new SparkContext(conf)
    val data = sc.textFile("conf\\u1.txt")

    val ratings = data.map(_.split(" ") match {
      //将数据集转化为专用Rating
      case Array(user, item, rate) => Rating(user.toInt, item.toInt, rate.toDouble)
    })
    //设置隐藏因子
    val rank = 2
    //设置迭代次数
    val numIterations = 2
    //训练模型
    val model = ALS.train(ratings,rank,numIterations,0.01)
    //为用户2推荐一个商品
    val rs = model.recommendProducts(2,1)
    for (elem <- rs) {
      println(elem)
    }

  }

}
